# 编译工具库

# 全局变量存储解析后的参数
declare -A ARGS

# 参数解析函数
function parse_args() {
  local args=("$@")  # 接收所有参数
  local i=0

  while [[ $i -lt ${#args[@]} ]]; do
    local arg="${args[$i]}"

    # 检查是否以 -- 开头
    if [[ "$arg" == --* ]]; then
      # 提取 key（去掉 --）
      local key="${arg#--}"

      # 处理 --key=value 形式
      if [[ "$arg" == *"="* ]]; then
        local value="${arg#*=}"  # 去掉 key= 部分
        key="${key%%=*}"  # 去掉后面的 = 及之后的值部分
        ARGS["$key"]="$value"
      # 处理 --key value 形式
      # elif [[ $((i+1)) -lt ${#args[@]} && ! ${args[$((i+1))]} == --* ]]; then
      elif [[ $((i+1)) -lt ${#args[@]} && ! "${args[$((i+1))]}" == --* ]]; then
        ARGS["$key"]="${args[$((i+1))]}"
        ((i++))  # 跳过下一个参数
      else
        ARGS["$key"]="1"  # 如果没有值，默认设为 true（如 --help）
      fi
    else
      echo "Unknown option: $arg"
      return 1
    fi
        
    ((i++))
  done
}

# 打npm三方件，输出tgz文件
# path: 项目路径，相对于项目根目录
# install: 是否安装依赖(0不安装，1安装)
# eg: generate_tgz --path=react-native-harmony-cli --install
function generate_tgz() {
  # 清空 ARGS（避免污染）
  unset ARGS
  declare -gA ARGS

  # 调用 parse_args 解析参数
  parse_args "$@"

  local path="${ARGS[path]}"
  local install="${ARGS[install]}"

  echo "[INFO] Start packaging $path"
  # 跳转到目标路径
  cd "$PRJ_DIR/$path"
  if [[ $? -ne 0 ]]; then
		echo "[ERROR] Can't found Path: $path"	
		return 1
	fi
  # 安装依赖+打包
  if [[ "$install" == 1 ]]; then
    npm i && npm pack
  else
    npm pack
  fi
  if [[ $? -ne 0 ]]; then
    echo "[ERROR] Failed to package $path"
    return 1
  fi
  echo "[SUCCESS] Successfully packaged $path"
  # 归档产物
  cp *.tgz "$RNOH_OUT"/
  return 0
}

# 清空并创建新目录
# path: 目录路径
# eg: check_dir --path="$RNOH_OUT"
function check_dir() {
  # 清空 ARGS（避免污染）
  unset ARGS
  declare -gA ARGS

  # 调用 parse_args 解析参数
  parse_args "$@"

  local path="${ARGS[path]}"

  echo "[INFO] Empty and create the directory: $path"
  if [ -d "$path" ]
  then
    rm -rf "$path/"
  fi
  mkdir -p "$path"
}

# 编译ohpm模块，生成har包（Debug模式）
# module: 模块名
# eg: assemble_har --module=react_native_openharmony
function assemble_har() {
  # 清空 ARGS（避免污染）
  unset ARGS
  declare -gA ARGS

  # 调用 parse_args 解析参数
  parse_args "$@"

  local module="${ARGS[module]}"

  echo "[INFO] Start to make module '$module'"
  cd "$PRJ_DIR"/tester/harmony
  # 编译模块
  echo "[INFO] hvigorw clean"
  hvigorw clean
  # 如果不加 --no-daemon 选项，有时候会报错。命令行模式下推荐使用此参数。
  echo "[INFO] hvigorw assembleHar --mode module -p module=$module@default -p product=default -p buildMode=debug -p debuggable=true --no-daemon"
	hvigorw assembleHar --mode module -p module=$module@default -p product=default -p buildMode=debug -p debuggable=true --no-daemon
  if [ $? -ne 0 ]; then
    echo "[ERROR] Failed to make module '$module'"
    return 1
  fi
	echo "[SUCCESS] Make module '$module' successfully"
  # 归档产物
  cp "./$module/build/default/outputs/default/$module.har" "$RNOH_OUT/$module-$VERSION.har"
  return 0
}

# 构建 debug 模式tester
function assemble_tester() {
  echo "[INFO] Building tester"
  cd "$PRJ_DIR"/tester/harmony

  echo "[INFO] hvigorw clean"
  hvigorw clean
  
  echo "[INFO] sync and build tester"
  hvigorw --sync -p product=default --analyze=false --parallel --incremental --daemon &&
  hvigorw --mode module -p module=entry@default -p product=default -p buildMode=debug -p requiredDeviceType=phone assembleHap --analyze=false --incremental --daemon
  if [ $? -ne 0 ]; then
    echo "[ERROR] Build tester failed"
    return 1
  fi
	echo "[SUCCESS] Build tester success"
  ls ./entry/build/default/outputs/default/
  # 归档产物
  cp "./entry/build/default/outputs/default/entry-default-unsigned.hap" "$RNOH_OUT/tester-entry-unsigned-$VERSION.hap"
  return 0
}

# 打包
# command: 打包命令
# eg: create_bundle --command=bundle:dev
function create_bundle() {
  # 清空 ARGS（避免污染）
  unset ARGS
  declare -gA ARGS

  # 调用 parse_args 解析参数
  parse_args "$@"

  local command="${ARGS[command]}"

  echo "[INFO] Start to create bundle"
  cd "$PRJ_DIR"/tester
  npm run "$command"
  if [ $? -ne 0 ]; then
    echo "[ERROR] Failed to create bundle"
    return 1
  fi
  echo "[SUCCESS] Create bundle success"
  return 0
}
